home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d919.lha / BBBF / FileVirLib / DetQuick2,04.S < prev    next >
Text File  |  1993-10-04  |  8KB  |  432 lines

  1. ;--------------------------------------------------------------------------
  2. ;      Demo-programme for the 'removelink.library'
  3. ;        Written (and © Johan Ohman 1993)
  4. ;
  5. ;            DetQuick version 2.04
  6. ;--------------------------------------------------------------------------
  7.  
  8. VER:    macro
  9.     dc.b    '2.04'
  10.     endm
  11.  
  12.     incdir    sys:include/
  13.     include    rll/removelink.i
  14.     include    rll/doshunks.i
  15.     include    rll/removelink_lib.i
  16.     include    libraries/dos_lib.i
  17.     include    libraries/dos.i
  18.     include    libraries/dosextens.i
  19.     include    exec/memory.i
  20.     include    exec/exec_lib.i
  21.  
  22. CALL:    macro
  23.     jsr    _LVO\1(a6)
  24.     endm
  25.  
  26. s:    movem.l    d0-a6,-(sp)
  27.     move.l    4.w,a6
  28.     suba.l    a1,a1
  29.     CALL    FindTask
  30.     move.l    d0,a4
  31.  
  32.     tst.l    pr_CLI(a4)
  33.     bne.b    .CLI_ACTIVE
  34.  
  35.     lea.l    pr_MsgPort(a4),a1
  36.     CALL    WaitPort
  37.     lea.l    pr_MsgPort(a4),a1
  38.     CALL    GetMsg
  39.  
  40. .CLI_ACTIVE:
  41.     movem.l    (sp)+,d0-a6
  42.  
  43.     movem.l    d0/a0,-(sp)
  44.     move.l    4.w,a6
  45.     lea.l    DosLib(pc),a1
  46.     CALL    OldOpenLibrary
  47.     move.l    d0,DosBase
  48.     movem.l    (sp)+,d0/a0
  49.  
  50.     move.l    a0,ArgA0
  51.     move.l    d0,ArgD0
  52.     
  53.     subq.l    #1,d0
  54.     beq.w    NoArgs
  55.  
  56.     clr.b    (a0,d0.l)
  57.  
  58. .OpenRL:
  59.     move.l    4.w,a6
  60.     lea.l    RLLib(pc),a1
  61.     moveq.l    #32,d0
  62.     CALL    OpenLibrary
  63.     move.l    d0,RLBase
  64.     tst.l    d0
  65.     bne.b    .ChangeDir
  66.  
  67.     pea.l    RLLib(pc)
  68.     pea.l    _NoLib(pc)
  69.     bsr.w    PrintF
  70.     addq.l    #8,Sp
  71.     rts
  72.     
  73. .ChangeDir:
  74.     move.l    DosBase(pc),a6
  75.     move.l    ArgA0(pc),d1
  76.     moveq.l    #ACCESS_READ,d2
  77.     CALL    Lock
  78.     tst.l    d0
  79.     beq.w    CloseLibs
  80.  
  81.     move.l    d0,MyLock
  82.     move.l    d0,d1
  83.     CALL    CurrentDir
  84.     move.l    d0,OldLock
  85.     
  86.     move.l    DosBase(pc),a6
  87.     move.l    MyLock(pc),d1
  88.     move.l    #MyFileInfoBlock,d2
  89.     CALL    Examine
  90.  
  91.     lea.l    MyFileInfoBlock+FIB_FileName,a0
  92.     move.l    a0,-(sp)
  93.     pea.l    _DiskName(pc)
  94.     bsr.w    PrintF
  95.     addq.l    #8,sp
  96.  
  97.     move.l    4.w,a6            ;So the user should be able to interrupt
  98.     moveq.l    #SIGBREAKB_CTRL_C,d0    ;scan ...
  99.     CALL    AllocSignal
  100.  
  101. ContinueScan:
  102.     move.l    4.w,a6
  103.     moveq.l    #0,d0
  104.     moveq.l    #0,d1
  105.     CALL    SetSignal
  106.     andi.l    #SIGBREAKF_CTRL_C,d0
  107.     tst.l    d0
  108.     bne.w    Interrupted
  109.  
  110.     move.l    DosBase(pc),a6
  111.     move.l    MyLock(pc),d1
  112.     move.l    #MyFileInfoBlock,d2
  113.     CALL    ExNext
  114.     cmp.l    #-1,d0
  115.     bne.w    ScanDiskError
  116.  
  117.     lea.l    MyFileInfoBlock,a0
  118.     tst.w    FIB_DirEntryType(a0)
  119.     bmi.b    File
  120.  
  121.     lea.l    MyFileInfoBlock,a0
  122.     pea.l    FIB_FileName(a0)
  123.     pea.l    _DIR(pc)
  124.     bsr.w    PrintF
  125.     addq.l    #8,Sp
  126.     bra.b    ContinueScan
  127.  
  128. File:    lea.l    MyFileInfoBlock,a0
  129.     cmp.w    #FIBF_READ,FIB_Protection(a0)
  130.     bne.b    .GoOn
  131.  
  132.     lea.l    MyFileInfoBlock+FIB_FileName,a0
  133.     move.l    a0,-(sp)
  134.     pea.l    _FileProtected(pc)
  135.     bsr.w    PrintF
  136.     addq.l    #8,Sp
  137.     bra.b    ContinueScan
  138.  
  139. .GoOn:
  140.     lea.l    MyFileInfoBlock+FIB_FileName,a0
  141.     bsr.w    LoadFile
  142.     tst.l    d0
  143.     bpl.b    .Exec
  144.  
  145.     addq.l    #1,d0
  146.     beq.b    .NotExec
  147.  
  148.     lea.l    FIB_FileName(a0),a0
  149.     move.l    Mem(pc),-(sp)
  150.     move.l    FIB_FileName(a0),-(sp)
  151.     pea.l    _NotEnoghMem(pc)
  152.     bsr.w    PrintF
  153.     lea.l    12(sp),sp
  154.     bra.w    ContinueScan
  155.  
  156. .NotExec:
  157.     lea.l    MyFileInfoBlock+FIB_FileName,a0
  158.     move.l    a0,-(sp)
  159.     pea.l    _NotExec(pc)
  160.     bsr.w    PrintF
  161.     addq.l    #8,sp
  162.     bra.w    ContinueScan
  163.  
  164. .Exec:
  165.  
  166. ;------------------------------------------------------------------------------
  167. ;    This is where we use the 'removelink.library' to check for
  168. ;    viruses linked up with the current file.
  169. ;    We only get the name. We don't repair the file (although we can
  170. ;    use the library for that too...).
  171. ;------------------------------------------------------------------------------
  172.  
  173.     move.l    RLBase(pc),a6
  174.     CALL    AllocRLMem
  175.     move.l    d0,RLMemPtr
  176.  
  177.     move.l    RLMemPtr(pc),a0
  178.     move.l    Mem(pc),RL_BufferLen(a0)
  179.     move.l    FileMemPtr(pc),RL_BufferPtr(a0)
  180.     move.l    RLBase(pc),a6
  181.     CALL    GetFileVName
  182.  
  183.     tst.l    RL_FileInfection(a0)
  184.     beq.b    .NotInfected
  185.  
  186.     move.l    RL_FileInfection(a0),a1
  187.     move.l    FI_VirusName(a1),-(sp)
  188.  
  189.     lea.l    MyFileInfoBlock+FIB_FileName,a0
  190.     move.l    a0,-(sp)
  191.  
  192.     pea.l    _FileInfection(pc)
  193.     bsr.w    PrintF
  194.     lea.l    12(sp),Sp
  195.     bra.b    .End
  196.  
  197. .NotInfected:
  198.     lea.l    MyFileInfoBlock,a0
  199.     lea.l    MyFileInfoBlock+FIB_FileName,a0
  200.     move.l    a0,-(sp)
  201.     pea.l    _NotInfected(pc)
  202.     bsr.b    PrintF
  203.     addq.l    #8,sp
  204.  
  205. .End:    bsr.w    ReturnRL
  206.     bsr.w    ReturnFileMem
  207.     bra.w    ContinueScan
  208.  
  209. NoArgs:
  210.     pea.l    RLLib(pc)
  211.     pea.l    _NoArgs(pc)
  212.     bsr.b    PrintF
  213.     addq.l    #8,Sp
  214.     rts
  215.  
  216. ScanDiskError:
  217.     CALL    IoErr
  218.     cmp.l    #ERROR_NO_MORE_ENTRIES,d0
  219.     beq.b    ScanComplete
  220.  
  221.     pea.l    _ScanDiskError(pc)
  222.     bsr.b    PrintF
  223.     addq.l    #4,Sp
  224.     rts
  225.  
  226. ScanComplete:
  227.     pea.l    _ScanComplete(pc)
  228.     bsr.b    PrintF
  229.     addq.l    #4,Sp
  230.  
  231.     move.l    OldLock(pc),d1
  232.     move.l    DosBase(pc),a6
  233.     CALL    CurrentDir
  234.  
  235.     move.l    MyLock(pc),d1
  236.     move.l    DosBase(pc),a6
  237.     CALL    UnLock
  238.  
  239. CloseLibs:
  240.     move.l    DosBase(pc),a1
  241.     move.l    4.w,a6
  242.     CALL    CloseLibrary
  243.  
  244.     Move.l    RLBase(pc),d0
  245.     beq.b    .Not1
  246.     move.l    d0,a1
  247.     CALL    closelibrary
  248. .Not1:    rts
  249.  
  250. Interrupted:
  251.     pea.l    _C(pc)
  252.     bsr.b    PrintF
  253.     addq.l    #4,Sp
  254.     bra.b    ScanComplete
  255.  
  256. PrintF:
  257.     movem.l    d0-a6,-(Sp)
  258.     move.l    4.w,a6
  259.     move.l    15*4+4*1(Sp),a0
  260.     lea.l    15*4+4*2(Sp),a1    
  261.     lea.l    .SubPrintF(pc),a2
  262.     link    a5,#-512
  263.     move.l    a5,a3
  264.     lea.l    -512(a3),a3
  265.     jsr    _LVORawDoFMT(a6)
  266.     movem.l    d0-a6,-(sp)
  267.     lea.l    -512(a5),a5
  268.     move.l    DosBase(pc),a6
  269.     jsr    -60(a6)
  270.     move.l    d0,d1
  271.     move.l    a5,d2
  272. .1:    tst.b    (a5)+
  273.     bne.b    .1
  274.     move.l    a5,d3
  275.     sub.l    d2,d3
  276.     jsr    -48(a6)
  277.     movem.l    (Sp)+,d0-a6
  278.  
  279.     unlk    a5
  280.     movem.l    (Sp)+,d0-a6
  281.     rts
  282.  
  283. .SubPrintF:
  284.     move.b    d0,(a3)+
  285.     rts
  286.  
  287. ;------------------------------------------------------------------------------
  288. ;    Smart(er)Loader 1.10:
  289. ;    Checks if the the file is executable,
  290. ;
  291. ;                if - read the first hunk of the file
  292. ;                if not - just give a message
  293. ;
  294. ;    Don't worry if you don't understand all.
  295. ;    It only reads the first hunk of a file.
  296. ;------------------------------------------------------------------------------
  297.  
  298.  
  299. LoadFile:
  300. LF_Size=    6*4
  301.     movem.l    d1-a6,-(sp)
  302.     moveq.l    #0,d5        ;Flag
  303.  
  304.     move.l    a0,d1
  305.     move.l    #MODE_OLDFILE,d2
  306.     CALL    Open
  307.     tst.l    d0
  308.     beq.b    .OpenError
  309.     move.l    d0,d4
  310.  
  311.     lea.l    HeaderBytes,a5
  312.     move.l    d4,d1
  313.     move.l    a5,d2
  314.     moveq.l    #LF_Size,d3
  315.     CALL    read
  316.     cmp.l    #HUNK_HEADER,(a5)
  317.     bne.b    .NotExec    ;We don't have to read this file no more
  318.  
  319.     move.l    2*4(a5),d1    ;Nr of hunks
  320.     move.l    5*4(a5),d0    ;Hunk1 size
  321.     lsl.l    #2,d0        ;into bytes
  322.  
  323.     ;We don't even have to load anything more than 
  324.     ;the first raw hunk. Not even the Reloc32Tables ...
  325.  
  326.     lea.l    5*4(a5,d1.l),a4
  327.     lea.l    2*4(a4,d0.l),a4
  328.     sub.l    a5,a4
  329.     addq.l    #4,a4
  330.     move.l    a4,Mem
  331.  
  332.     move.l    d4,d1
  333.     moveq.l    #0,d2
  334.     moveq.l    #OFFSET_BEGINING,d3
  335.     CALL    Seek
  336.  
  337.     move.l    a4,d0
  338.     moveq.l    #MEMF_PUBLIC,d1
  339.     move.l    4.w,a6
  340.     CALL    AllocMem
  341.     tst.l    d0
  342.     beq.b    .MemError
  343.  
  344.     move.l    d0,FileMemPtr
  345.     move.l    d0,d2
  346.     move.l    a4,d3
  347.     move.l    d4,d1
  348.     move.l    DosBase(pc),a6
  349.     CALL    Read
  350.     move.l    d0,d5
  351.  
  352. .End:    move.l    d4,d1
  353.     CALL    Close
  354.  
  355.     move.l    d5,d0
  356.     movem.l    (sp)+,d1-a6
  357.     rts
  358.  
  359. .NotExec:
  360.     moveq.l    #-1,d5
  361.     bra.b    .End
  362.  
  363. .MemError:
  364.     moveq.l    #-2,d5
  365.     bra.b    .End
  366.  
  367. .OpenError:
  368.     moveq.l    #-3,d5
  369.     bra.b    .End
  370.  
  371. ReturnFileMem:
  372.     move.l    FileMemPtr(pc),a1
  373.     move.l    Mem(pc),d0
  374.     move.l    4.w,a6
  375.     CALL    FreeMem
  376.     rts
  377.  
  378. ReturnRL:
  379.     move.l    RLMemPtr(pc),a0
  380.     move.l    RLBase(pc),a6
  381.     CALL    FreeRLMem
  382.     rts
  383.  
  384. ArgA0:        dc.l    0
  385. ArgD0:        dc.l    0
  386. DosBase:    dc.l    0
  387. RLBase:        dc.l    0
  388. MyLock:        dc.l    0
  389. FileMemPtr:    dc.l    0
  390. RLMemPtr:    dc.l    0
  391. OldLock:    dc.l    0
  392. Mem:        dc.l    0
  393.  
  394. RLLib:        RLNAME
  395. DosLib:        DOSNAME
  396.  
  397. _NoArgs:    dc.b    10
  398.         dc.b    'DetQuick v '
  399.         Ver
  400.         dc.b    ' (C) Johan Öhman 1993',10
  401.         dc.b    'Args:    RemQuick [Volume], to check all file on Volume'
  402.         dc.b    10
  403.         dc.b    '(This programme requires ''%s'' 32.00 or higher )',10,0
  404.         dc.b    10,0
  405.  
  406. _C:        dc.b    '^C (Scan interrupted) ',10,0
  407. _NoLib:        dc.b    'Sorry, I couldn''t find %s ...',10,0
  408. _ScanDiskError:    dc.b    'An error occured during scan...',10,0
  409. _ScanComplete    dc.b    'Disk-scan finished ',10,0
  410.  
  411. _FileProtected:    dc.b    '%30s    [Protected, can''t read]',10,0
  412. _DIR:        dc.b    $9b,'0;33;40m'
  413.         dc.b    '%30s    [DIR]',10
  414.         dc.b    $9b,'0;31;40m',0
  415.  
  416. _NotEnoghMem:    dc.b    '%30s    [Not enough memory (%ld required)]'
  417. _NotExec:    dc.b    '%30s    [DATA FILE]',10,0
  418. _NotInfected:    dc.b    '%30s    [Not Infected]',10,0
  419. _FileInfection:    dc.b    '%30s    [Infected by '
  420.         dc.b    $9b,'3;30;41m'
  421.         dc.b    '''%s'''
  422.         dc.b    $9b,'0;31;40m]',10,0
  423.  
  424. _DiskName:    dc.b    10
  425.         dc.b    'DiskName:    %30s',10,10,0
  426.  
  427.  
  428.     section    SomeThing,BSS_P
  429.  
  430. MyFileInfoBlock:ds.l    300/4
  431. HeaderBytes:    ds.l    6
  432.